/**
 * 综合测试套件
 * 运行所有关键功能的端到端测试
 */
describe('Vue跑酷游戏 - 综合测试套件', () => {
  before(() => {
    // 测试前的全局设置
    cy.clearLocalStorage()
    cy.clearCookies()
  })

  describe('核心功能验证', () => {
    it('应该完成完整的游戏体验流程', () => {
      // 1. 访问游戏
      cy.visit('/')
      cy.get('[data-cy="main-menu"]').should('be.visible')
      
      // 2. 开始游戏
      cy.get('[data-cy="start-game-btn"]').click()
      
      // 3. 选择角色
      cy.get('[data-cy="character-select"]').should('be.visible')
      cy.selectCharacter('default')
      
      // 4. 游戏进行
      cy.waitForGameLoad()
      cy.checkGameStatus('playing')
      
      // 5. 执行游戏操作
      cy.gameAction('jump')
      cy.wait(500)
      cy.gameAction('slide')
      cy.wait(500)
      
      // 6. 验证分数系统
      cy.get('[data-cy="score-display"]').should('not.contain', '0')
      
      // 7. 暂停和恢复
      cy.get('body').type('{esc}')
      cy.checkGameStatus('paused')
      cy.get('[data-cy="resume-btn"]').click()
      cy.checkGameStatus('playing')
      
      // 8. 结束游戏
      cy.window().then((win) => {
        win.dispatchEvent(new CustomEvent('game-over'))
      })
      
      // 9. 验证游戏结束流程
      cy.get('[data-cy="game-over-screen"]', { timeout: 5000 }).should('be.visible')
      cy.get('[data-cy="final-score"]').should('be.visible')
    })

    it('应该正确处理所有用户交互', () => {
      cy.visit('/')
      
      // 测试主菜单交互
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="settings-panel"]').should('be.visible')
      cy.get('[data-cy="close-settings-btn"]').click()
      
      cy.get('[data-cy="achievements-btn"]').click()
      cy.get('[data-cy="achievements-panel"]').should('be.visible')
      cy.get('[data-cy="close-achievements-btn"]').click()
      
      cy.get('[data-cy="leaderboard-btn"]').click()
      cy.get('[data-cy="leaderboard-panel"]').should('be.visible')
      cy.get('[data-cy="close-leaderboard-btn"]').click()
      
      // 测试游戏内交互
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 测试所有控制输入
      const actions = ['jump', 'slide', 'left', 'right']
      actions.forEach(action => {
        cy.gameAction(action as any)
        cy.wait(200)
      })
      
      // 测试暂停菜单交互
      cy.get('body').type('{esc}')
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="settings-panel"]').should('be.visible')
      cy.get('[data-cy="close-settings-btn"]').click()
      
      cy.get('[data-cy="menu-btn"]').click()
      cy.get('[data-cy="main-menu"]').should('be.visible')
    })
  })

  describe('数据持久化验证', () => {
    it('应该正确保存和恢复游戏数据', () => {
      // 设置一些游戏数据
      cy.visit('/')
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="master-volume"]').invoke('val', 75).trigger('input')
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 开始游戏获得分数
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 模拟获得分数
      cy.window().then((win) => {
        win.gameStore.score = 500
        win.dispatchEvent(new CustomEvent('game-over'))
      })
      
      // 刷新页面验证数据持久化
      cy.reload()
      
      // 验证设置保存
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="master-volume"]').should('have.value', '75')
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 验证分数保存
      cy.get('[data-cy="high-score"]').should('contain', '500')
    })
  })

  describe('错误恢复验证', () => {
    it('应该能够从各种错误中恢复', () => {
      cy.visit('/')
      
      // 测试网络错误恢复
      cy.intercept('**/*', { statusCode: 500 }).as('networkError')
      cy.get('[data-cy="start-game-btn"]').click()
      
      // 验证错误处理
      cy.get('[data-cy="error-notification"]').should('be.visible')
      
      // 恢复网络并重试
      cy.intercept('**/*').as('networkRecovered')
      cy.get('[data-cy="retry-btn"]').click()
      
      // 验证恢复成功
      cy.get('[data-cy="character-select"]').should('be.visible')
    })
  })

  describe('性能验证', () => {
    it('应该在各种条件下保持良好性能', () => {
      cy.visit('/')
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 执行大量操作测试性能
      for (let i = 0; i < 20; i++) {
        cy.gameAction('jump')
        cy.wait(100)
        cy.gameAction('slide')
        cy.wait(100)
      }
      
      // 验证游戏仍然响应
      cy.get('[data-cy="game-canvas"]').should('be.visible')
      cy.checkGameStatus('playing')
      
      // 验证帧率稳定
      cy.window().then((win) => {
        if (win.gameEngine && win.gameEngine.averageFPS) {
          expect(win.gameEngine.averageFPS).to.be.greaterThan(30)
        }
      })
    })
  })

  describe('跨浏览器兼容性验证', () => {
    it('应该在不同浏览器中正常工作', () => {
      cy.visit('/')
      
      // 验证基本功能
      cy.get('[data-cy="main-menu"]').should('be.visible')
      cy.get('[data-cy="start-game-btn"]').should('be.visible')
      
      // 验证浏览器特性检测
      cy.window().then((win) => {
        expect(win.browserSupport).to.exist
        expect(win.browserSupport.canvas).to.be.true
        expect(win.browserSupport.localStorage).to.be.true
      })
      
      // 测试核心游戏功能
      cy.startNewGame()
      cy.selectCharacter('default')
      cy.gameAction('jump')
      
      // 验证功能正常
      cy.get('[data-cy="player-sprite"]').should('have.class', 'jumping')
    })
  })

  describe('移动设备验证', () => {
    it('应该在移动设备上正常工作', () => {
      cy.viewport('iphone-x')
      cy.visit('/')
      
      // 验证移动端布局
      cy.get('[data-cy="main-menu"]').should('be.visible')
      cy.get('[data-cy="start-game-btn"]').should('have.class', 'mobile-size')
      
      // 测试触摸控制
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 验证触摸控制界面
      cy.get('[data-cy="touch-controls"]').should('be.visible')
      cy.get('[data-cy="jump-btn"]').should('be.visible')
      
      // 测试触摸操作
      cy.get('[data-cy="jump-btn"]').click()
      cy.get('[data-cy="player-sprite"]').should('have.class', 'jumping')
    })
  })

  describe('可访问性验证', () => {
    it('应该符合可访问性标准', () => {
      cy.visit('/')
      
      // 验证ARIA标签
      cy.get('[data-cy="main-menu"]').should('have.attr', 'role')
      cy.get('[data-cy="start-game-btn"]').should('have.attr', 'aria-label')
      
      // 验证键盘导航
      cy.get('body').tab()
      cy.focused().should('be.visible')
      
      // 验证焦点指示器
      cy.get('[data-cy="start-game-btn"]').focus()
      cy.get('[data-cy="start-game-btn"]').should('have.class', 'focus-visible')
    })
  })

  after(() => {
    // 测试后清理
    cy.clearLocalStorage()
    cy.clearCookies()
  })
})